///******************** NG.Respate(C)  **********************************
//* 产品名称: Respate 科技
//* 文件名称: signal.c
//* 程序作者: 雷帕特公司(南宫子萍)
//* 程序版本: V1.1														   
//* 编制日期: 2019/1/29
//* 功能描述: 系统日志
//* QQ:	2085827949
//**********************************************************************/

#include <unistd.h>
#include "stdio.h"
#include "stdlib.h"
#include "lap_lib.h"
#include "laperro.h"

#if 0

// 信号捕捉
#include <signal.h>
#include "sys/types.h"
// typedef void (*sighandler_t)(int);
// sighandler_t signal(int signum, sighandler_t handler);   // 由sigaction封装而来，移植性较差
// int sigaction(int signum, const struct sigaction *act,   // 移植性好，推荐使用
//               struct sigaction *oldact);


// 信号发送函数
#include <sys/types.h>
#include <signal.h>
// int kill(pid_t pid, int sig);  // 发送信号0 可以粗略判断指定进程是否存在
// int raise(int sig);            // 单进程中使用，相当于 kill(getpid(),sig);
// int killpg(int pgrp, int sig); // 给进程中发信号，相当于 kill(-pgrp,sig);
// 注意: 进程给自身发信号时，是立即发送(即在 kill，raise函数返回之前，就完成了发送)

// 信号捕捉回调函数
void signalHandler(int sig)
{
  if(sig == SIGINT)
    printf("Catch SIGINT\r\n");   // 信号回调函数，应避免调用stdio函数

  if(sig == SIGUSR2)
    printf("Catch SIGUSR2\r\n");   // 信号回调函数，应避免调用stdio函数

}



// signal 信号捕捉函数
static int Lap_signal()
{
  if(SIG_ERR == (int)signal(SIGINT,signalHandler)) perror("signal");

  usleep(1200); //
  kill(getpid(),SIGINT);   // 发送信号
  // pause();              // 挂起，等待信号到来
  //usleep(3000*20);
  return 0;
}



/*
struct sigaction
 {
  void     (*sa_handler)(int);
  void     (*sa_sigaction)(int, siginfo_t *, void *);
  sigset_t  sa_mask;
  int       sa_flags;
  void     (*sa_restorer)(void);
 };
*/

// sigaction 信号捕捉函数
static int Lap_sigaction()
{
  struct sigaction newact,oldact;

  /* 设置信号忽略 */
  newact.sa_handler = signalHandler; //这个地方也可以是函数
  sigemptyset(&newact.sa_mask);
  newact.sa_flags = 0;

  if(SIG_ERR == (int)sigaction(SIGUSR2,&newact,&oldact))//原来的备份到oldact里面
    perror("sigaction err");

  usleep(1200); //
  raise(SIGUSR2);
  return 0;
}


// #if 0
int main(void)
{
  LAP_ErrOutSet(NULL);  // 错误输出 初始化

  Lap_signal();         // 捕捉系统信号
  Lap_sigaction();      // 捕捉系统信号

  // while (1) pause();  // 挂起，等待信号到来
  // return 0;
}
#endif